package cn.bugstack.domain.strategy.repository;

import cn.bugstack.domain.strategy.model.entity.StrategyAwardEntity;
import cn.bugstack.domain.strategy.model.entity.StrategyEntity;
import cn.bugstack.domain.strategy.model.entity.StrategyRuleEntity;
import cn.bugstack.domain.strategy.model.valobj.StrategyAwardRuleModelVO;

import java.math.BigDecimal;
import java.util.HashMap;
import java.util.List;

/**
 * 策略的仓储接口
 */


public interface IStrategyRepository {

    //根据策略id查询策略奖品表，得到策略配置
    List<StrategyAwardEntity> queryStrategyAwardList(Long strategyId);

    //将 策略奖品搜寻概率表 存到 Redis中
    void storeStrategyAwardSearchRateTables(String key, Integer rateRange, HashMap<Integer, Integer> shuffleStrategyAwardSearchRateTables);

    /**
     * 调用仓储层接口 根据 策略id 查询(缓存查) 概率索引范围值rateRange
     * @param strategyId
     * @return
     */
    int getRateRange(Long strategyId);


    /**
     * 调用仓储层接口 规则权重key 查询(缓存查) 概率索引范围值rateRange
     * @param key
     * @return
     */
    int getRateRange(String key);

    /**
     * 随机生成一个在范围内的数字用于 抽奖数字，通过策略id 和 这个随机生成的数字 调用仓储层接口 查询(缓存查) 概率表
     * @param strategyId
     * @param randomNum
     * @return
     */
    Integer getStrategyAwardAssemble(Long strategyId, int randomNum);

    /**
     * 随机生成一个在范围内的数字用于 抽奖数字，通过 规则权重key 和 这个随机生成的数字 调用仓储层接口 查询(缓存查) 概率表
     * @param key
     * @param randomNum
     * @return
     */
    Integer getStrategyAwardAssemble(String key, int randomNum);

    /**
     * 权重规则 配置 —— 符合 rule_weight
     * @param strategyId
     * @return
     */
    StrategyEntity queryStrategyEntityByStrategyId(Long strategyId);

    /**
     * 根据策略id 和 规则权重 查询 策略规则实体类
     * @param strategyId
     * @param ruleWeight
     * @return
     */
    StrategyRuleEntity queryStrategyRule(Long strategyId, String ruleWeight);


    /**
     * //查询规则配置 在表strategy_rule表中 根据RuleMatterEntity 查询 rule_value
     * @param strategyId
     * @param awardId
     * @param ruleModel
     * @return
     */
    String queryStrategyRuleValue(Long strategyId, Integer awardId, String ruleModel);

    /**
     * 查询规则配置 在表strategy_rule表中 根据策略id和 规则模型查询 对应策略规则值
     * @param strategyId
     * @param ruleModel
     * @return
     */
    String queryStrategyRuleValue(Long strategyId, String ruleModel);



    /**
     * 根据策略id和奖品id查询 规则模型rule_models
     * @param strategyId
     * @param awardId
     * @return
     */

    StrategyAwardRuleModelVO queryStrategyAwardRuleModelVO(Long strategyId, Integer awardId);
}
